﻿/** 调用了MyUI(2023-01-28)的龙与地下城1脚本(utf-8 with BOM)
  作用是设置exe和宏,读取预设
  连发作为宏实现,不另外设置
  游戏按键,宏热键都在全局常量中设定
  各种宏的函数以中文命名
  
  By setycyas @2023-01-28
*/

/* 全局
*/{

  ;** 全局设置
  #NoEnv
  #Warn
  #MaxThreadsPerHotkey 1
  SendMode Input
  SetWorkingDir %A_ScriptDir%
  
  ;** 库调用
  #Include ..\MyAhkModules\MyFuns.ahk ;自制常用函数库,所有导出函数以MyFuns_开头
  #Include ..\MyAhkModules\MyKey.ahk ;按键相关库,所有导出函数以MyKey_开头
  #Include ..\MyAhkModules\MyFaceDetector.ahk ;方向检测,用MyFaceDetector_setup()函数设置
  #Include ..\MyAhkModules\MyWinkawaks.ahk ;导入自定义的Winkawaks通用快捷键,用MyWinKawaks_setHotkeys()函数设置
  #Include ..\MyAhkModules\MyNebula.ahk ;导入自定义的Nebula通用快捷键,用MyNebula_setHotkeys()函数设置
  #Include ..\MyAhkModules\MyUI.ahk ;自定义界面设定和热键宏定义模块,使用MyUI_setup()函数设置

  ;** 全局常量
  ;可能选择的exe字符串表,用于gui组件,按组件格式写
  global EXE_LIST := "WinKawaks.exe|Nebula.exe|X-Zone.exe"
  ;游戏按键
  global KEY1 := "x", KEY2 := "e"
  ;热键表
  global MACRO_KEYS := ["w", "q", "2", "3", "r", "a"]
  ;技能名称字符串表,用于gui组件,按组件格式写
  global MACRO_LIST := "连发|蹲后滑斩|蹲后滑行|下蹲|前A|A后防御|左右摇"
  ;预设
  global PRESET := {}
  PRESET["默认"] := ["连发", "蹲后滑斩", "下蹲", "A后防御", "蹲后滑行", "左右摇"]
  ;连发按键时按住键的时长
  global AUTOFIRE_DURATION := 25
  ;最大连发频率
  global MAX_FPS := 30
  
  ;** 绑定gui组件的全局变量,以G开头
  ;连发频率参数,设置上限为MAX_FPS
  global GautoFireFPS := 7
  ;测试参数
  global GtestParam1 := 20, GtestParam2 := 500, GtestParam3 := 500 ;
  
  ;** 全局变量
  global fps := MyFuns_arrMin([GautoFireFPS, MAX_FPS]) ;实际设定连发的频率,上限为MAX_FPS
  global autoFireDelay := floor(1000/fps)-AUTOFIRE_DURATION ;连发延时
}

/* 操作与技能函数 
*/{
  
  ;** 技能函数,使用中文
  ;若GautoFireFPS为0,则做成单发
  连发(){
    local thisHotkey :=  MyFuns_getHotkey(A_ThisHotkey) ;触发技能的热键
    if (GautoFireFPS == 0){
      send, {%KEY1% down}
      while (GetKeyState(thisHotkey)){
        sleep, 20
      }
      send, {%KEY1% up}
    } else {
      MyKey_press(KEY1, AUTOFIRE_DURATION)
      while (!MyKey_waitKeyUp(thisHotkey, autoFireDelay, 20)){
        MyKey_press(KEY1, AUTOFIRE_DURATION)
      }
    }
  }
  下蹲(){
    send, {down down}
    sleep, 50
    send, {%KEY2% down}
    sleep, 50
    send, {down up}
  }
  蹲后滑斩(){
    local face := MyFaceDetector_getFace()
    send, {%KEY2% up}
    sleep, 20
    MyKey_pressKeys([face, KEY1], [25], 50)
  }
  蹲后滑行(){
    local face := MyFaceDetector_getFace()
    send, {%KEY2% up}
    sleep, 20
    MyKey_pressKeys([face, key2], [25], 50)
  }
  A后防御(){
    local thisHotkey :=  MyFuns_getHotkey(A_ThisHotkey) ;触发技能的热键
    local backFace := MyFaceDetector_getBackFace()
    send, {%KEY1% down}
    sleep, 50
    MyKey_press(backFace, 200)
    while (GetKeyState(thisHotkey)) {
      sleep, 20
    }
    send, {%KEY1% up}
  }
  前A(){
    local face := MyFaceDetector_getFace()
	MyKey_pressKeys([face, KEY1], [25], 25)
  }
  左右摇(){
    local thisHotkey :=  MyFuns_getHotkey(A_ThisHotkey) ;触发技能的热键
    while (GetKeyState(thisHotkey)) {
      MyKey_press("right", 20)
      sleep, 20
      ;MyKey_pressKeys(["left", key1], [20], 20)
      MyKey_press("left", 20)
      sleep, 20
    }
  }
  
  ;** 其他需要使用的函数
}

/* MyUI相关接口实现
*/{
  ;自定义参数部分
  MyUI_customGui(){
    Gui, Add, Text, x+20 y+20, 连发频率(FPS)： ;次/秒
    Gui, Add, Edit, xp+80 yp-3 W60 vGautoFireFPS, %GautoFireFPS%
    Gui, Add, Text, xp-80 yp+30, 测试参数1： ;
    Gui, Add, Edit, xp+80 yp-3 W60 vGtestParam1, %GtestParam1%
    Gui, Add, Text, xp-80 yp+30, 测试参数2： ;
    Gui, Add, Edit, xp+80 yp-3 W60 vGtestParam2, %GtestParam2%
    Gui, Add, Text, xp-80 yp+30, 测试参数3： ;
    Gui, Add, Edit, xp+80 yp-3 W60 vGtestParam3, %GtestParam3%
  }
  
  ;提交数据时的一些额外操作
  on_MyUI_Submit(){
    ;初次提交时安装方向检测,对应的模拟器模块设定
    if (__MyUI_submitTimes == 1){
      MyFaceDetector_setup(__MyUI_Gexe)
      if (__MyUI_Gexe == "WinKawaks.exe") {
        MyWinKawaks_setHotkeys()
      }
      if (__MyUI_Gexe == "Nebula.exe") {
        MyNebula_setHotkeys()
      }
    }
    ;处理连发参数
    if (GautoFireFPS != 0){
      fps := MyFuns_arrMin([GautoFireFPS, MAX_FPS]) ;实际设定连发的频率,上限为MAX_FPS
      autoFireDelay := floor(1000/fps)-AUTOFIRE_DURATION ;连发延时
    }
  }
  
}

/* 运行脚本 
*/ {
  MyUI_setup("龙与地下城1", EXE_LIST, MACRO_KEYS, MACRO_LIST, PRESET)
  MyUI_MenuReadPreset("默认")
}
